.TH SG_OPCODES "8" "June 2023" "sg3_utils\-1.48" SG3_UTILS
.SH NAME
sg_opcodes \- report supported SCSI commands or task management functions
.SH SYNOPSIS
.B sg_opcodes
[\fI\-\-alpha\fR] [\fI\-\-compact\fR] [\fI\-\-enumerate\fR] [\fI\-\-help\fR]
[\fI\-\-hex\fR] [\fI\-\-inhex=FN\fR] [\fI\-\-json[=JO]\fR]
[\fI\-\-js\-file=JFN\fR] [\fI\-\-mask\fR] [\fI\-\-mlu\fR]
[\fI\-\-no-inquiry\fR] [\fI\-\-opcode=OP[,SA]\fR] [\fI\-\-pdt=DT\fR]
[\fI\-\-raw\fR] [\fI\-\-rctd\fR] [\fI\-\-repd\fR] [\fI\-\-sa=SA\fR]
[\fI\-\-tmf\fR] [\fI\-\-unsorted\fR] [\fI\-\-verbose\fR] [\fI\-\-version\fR]
\fIDEVICE\fR
.PP
.B sg_opcodes
[\fI\-a\fR] [\fI\-c\fR] [\fI\-e\fR] [\fI\-H\fR] [\fI\-i=FN\fR] [\fI\-j\fR]
[\fI\-m\fR] [\fI\-M\fR] [\fI\-n\fR] [\fI\-o=OP\fR] [\fI\-p=DT\fR] [\fI\-q\fR]
[\fI\-R\fR] [\fI\-s=SA\fR] [\fI\-t\fR] [\fI\-u\fR] [\fI\-v\fR] [\fI\-V\fR]
[\fI\-?\fR] \fIDEVICE\fR
.SH DESCRIPTION
.\" Add any additional description here
This utility sends a SCSI REPORT SUPPORTED OPERATION CODES or a REPORT
SUPPORTED TASK MANAGEMENT FUNCTIONS command to the \fIDEVICE\fR and then
outputs the response. The default action is to report supported operation
codes. In this mode it will either list all supported commands or give
detailed information on a specific command identified by the
\fI\-\-opcode=OP\fR option (perhaps with additional information from the
\fI\-\-sa=SA\fR option).
.PP
The name of a SCSI command depends on its peripheral device type (e.g. a
disk). The REPORT SUPPORTED OPERATION CODES and REPORT SUPPORTED TASK
MANAGEMENT FUNCTIONS commands are not supported in the MMC command set for
CD and DVD devices. This utility does an INQUIRY to obtain the peripheral
device type and prints out the vendor, product and revision strings.
.PP
A similar facility to query supported operation codes previously was available
via the CmdDt bit in the SCSI INQUIRY command (see sg_inq(8)). However that
facility was made obsolete and replaced by the REPORT SUPPORTED OPERATION
CODES command in SPC\-3 (revision 4) during February 2002.
.PP
This utility supports two command line syntaxes, the preferred one is
shown first in the synopsis and explained in this section. A later section
on the old command line syntax outlines the second group of options.
.SH OPTIONS
Arguments to long options are mandatory for short options as well.
.TP
\fB\-a\fR, \fB\-\-alpha\fR
when all supported commands are being listed there is no requirement for
the device server (i.e. the \fIDEVICE\fR) to sort the list of commands. When
this option is given the list of supported commands is sorted by
name (alphabetically). When this option and the \fB\-\-unsorted\fR option are
both _not_ given then the list of supported commands is sorted
numerically (first by operation code and then by service action).
.TP
\fB\-c\fR, \fB\-\-compact\fR
some command names, especially those associated with some service actions,
are getting longer. This may cause line wrap in the one line per command
mode on some terminals. When this option is given the opcode and service
action fields are combined into a single field with the service action,
prefixed by a comma shown directly after the opcode. If there is no service
action associated with the command, then the comma and the service action
are not shown after the opcode. The CDB size field is not shown when this
option is given.
.TP
\fB\-e\fR, \fB\-\-enumerate\fR
this option prints the name of the SCSI command based on the given opcode,
peripheral device type and optionally the service action. If given,
\fIDEVICE\fR is ignored. The opcode, peripheral device type and service
action default to zero if not given. Thus if this option is the only option
given then "Test Unit ready" is output since its opcode is 0, it has no
service action and it is common to all peripheral device types since it is
defined in the SCSI Primary Commands (SPC) standard(s).
.TP
\fB\-h\fR, \fB\-\-help\fR
outputs the usage message summarizing command line options
then exits. Ignores \fIDEVICE\fR if given.
.TP
\fB\-H\fR, \fB\-\-hex\fR
outputs the response in ASCII hexadecimal to stdout. When used once or
twice, each line starts with a relative (hex) address starting at 0
on the first hex line output. The difference is when used twice the
hexadecimal bytes are rendered in ASCII at the right of each line;
non\-printable characters are replaced by "." .
.br
When used three or more times, there is no leading relative address
on each line. This output is suitable for being redirected to a file
which can later by given to the \fI\-\-inhex=FN\fR option.
.TP
\fB\-i\fR, \fB\-\-inhex\fR=\fIFN\fR
where \fIFN\fR is a file name whose contents are assumed to be ASCII
hexadecimal. If \fIDEVICE\fR is also given then \fIDEVICE\fR is ignored,
a warning is issued and the utility continues, decoding the file named
\fIFN\fR. See the "HEX, BINARY AND JSON FORMATS" section in the
sg3_utils manpage for more information. If the \fI\-\-raw\fR option is
also given then the contents of \fIFN\fR are treated as binary.
.TP
\fB\-j\fR[=\fIJO\fR], \fB\-\-json\fR[=\fIJO\fR]
output is in JSON format instead of plain text form. Note that arguments
to the short and long form are themselves optional and if present start
with "=" and no whitespace is permitted around that "=".
.br
See sg3_utils_json manpage or use '?' for \fIJO\fR to get a summary.
.TP
\fB\-J\fR, \fB\-\-js\-file\fR=\fIJFN\fR
output is in JSON format and it is sent to a file named \fIJFN\fR. If that
file exists then it is truncated. By default, the JSON output is sent to
stdout.
.br
When this option is given, the \fI\-\-json[=JO]\fR option is implied and
need not be given. The \fI\-\-json[=JO]\fR option may still be needed to
set the \fIJO\fR parameter to non-default values.
.TP
\fB\-m\fR, \fB\-\-mask\fR
additionally prints out the cdb mask in hex. So a 12 byte cdb will have
a 12 byte hexadecimal mask. If the hexadecimal is expanded (mentally)
to binary then a "1" means the corresponding position in the cdb may
be set. And "0" means the corresponding position in the cdb must not
be set. For "0" mask positions that a user tries to set in a cdb, the
device may either ignore it or report an error, typically with a
sense key of "illegal request".
.TP
\fB\-M\fR, \fB\-\-mlu\fR
additionally prints out an indication (0 or 1) whether the command
effects all logical units in the containing target. MLU (Multiple Logical
Units) is a bit in the REPORT SUPPORTED OPERATION CODES response
introduced by proposal 18\-045r1 (and possibly in spc5r20). Without
the option, the default output format which lists all opcodes, does
not include a MLU indication.
.TP
\fB\-n\fR, \fB\-\-no-inquiry\fR
Prior to calling a SCSI REPORT SUPPORTED OPERATION CODES or a REPORT
SUPPORTED TASK MANAGEMENT FUNCTIONS command, a SCSI INQUIRY command
is performed. The reason is to determine the peripheral device type (pdt)
of the \fIDEVICE\fR as this is helpful in translating operation codes
to the command names. By default this utility prints a summary of INQUIRY
command response on stdout. If this option (or the \fI\-\-raw\fR option)
is given then that summary is not printed on stdout.
.TP
\fB\-O\fR, \fB\-\-old\fR
Switch to older style options. Please use as first option.
.TP
\fB\-o\fR, \fB\-\-opcode\fR=\fIOP[,SA]\fR
the \fIDEVICE\fR will be queried for the given operation code (i.e. the
\fIOP\fR value) which is the first byte of a SCSI command. Optionally, if
a \fISA\fR value is given, it will be used as that SCSI command's service
action. Note that \fIOP\fR and \fIOP,0\fR are not the same thing, as SCSI
does allow the service action to be 0 (but not in this command). \fIOP\fR
and \fISA\fR are decimal unless prefixed by "0x" or they have a
trailing "h". \fIOP\fR should be in the range 0 to 255 (0xff) inclusive.
\fISA\fR should be in the range 0 to 65535 (0xffff) inclusive. When this
option is not given then all available SCSI commands supported by the
\fIDEVICE\fR are listed.
.TP
\fB\-p\fR, \fB\-\-pdt\fR=\fIDT\fR
where \fIDT\fR is the peripheral device type. This is used together with
the \fI\-\-enumerate\fR to differentiate when a command opcode (and perhaps
service action) is shared by multiple device types.
.br
Numerical values between -1 and 31 (inclusive) may be used where -1 implies
what is in SPC. Names like 'tape', 'disk' and 'processor' may also be given.
.br
This option may also be used with the \fI\-\-no-inquiry\fR option to
suppress this utility doing an INQUIRY command since the main reason
for doing that is to find the peripheral device type of the \fIDEVICE\fR.
.TP
\fB\-r\fR, \fB\-\-raw\fR
output response in binary (to stdout) unless the \fI\-\-inhex=FN\fR option
is also given. In that case the input file name (\fIFN\fR) is decoded as
binary (and the output is _not_ in binary (but may be hex)).
.TP
\fB\-R\fR, \fB\-\-rctd\fR
set report command timeout descriptor (RCTD) bit in the cdb. The response
may or may not contain command timeout descriptors. If available they are
output. If supported there are two values: a nominal command timeout
and a recommended command timeout. Both have units of seconds. A value
of zero means that no timeout is indicated and this is shown in
the corresponding decoded output as "\-".
.TP
\fB\-q\fR, \fB\-\-repd\fR
set read extended parameter data (REPD) bit in the report task management
functions cdb. 16 bytes rather than the default 4 bytes expected in the
response. This was added in SPC\-4 (revision 26).
.TP
\fB\-s\fR, \fB\-\-sa\fR=\fISA\fR
the \fIDEVICE\fR will be queried for a command with the given service
action (i.e. the \fISA\fR value). Used in conjunction with the
\fI\-\-opcode=OP\fR option. If this option is not given, \fI\-\-opcode=OP\fR
is given and the command in question does have a service action then a value
of 0 will be assumed. \fISA\fR is decimal and expected to be in the range 0
to 65535 (0xffff) inclusive.
.TP
\fB\-t\fR, \fB\-\-tmf\fR
list supported task management functions. This is done with the SCSI REPORT
SUPPORTED TASK MANAGEMENT FUNCTIONS command.  When this option is chosen
the \fI\-\-alpha\fR, \fI\-\-opcode=OP\fR, \fI\-\-rctd\fR, \fI\-\-sa=SA\fR
and \fI\-\-unsorted\fR options are ignored.
.TP
\fB\-u\fR, \fB\-\-unsorted\fR
when all supported commands are being listed there is no requirement for
the device server (i.e. the \fIDEVICE\fR) to sort the list of commands. When
this option is given the list of supported commands is in the order given by
the \fIDEVICE\fR. When this option is not given the supported commands
are sorted numerically (first by operation code and then by service action).
.TP
\fB\-v\fR, \fB\-\-verbose\fR
increase level of verbosity. Can be used multiple times.
.TP
\fB\-V\fR, \fB\-\-version\fR
print out version string then exit.
.SH NOTES
As of SPC\-5 revision 8 the recognized task management functions are:
abort set, abort task set, clear ACA, clear task set, logical unit reset,
query task, query asynchronous event, query task set, and I_T nexus reset.
In SPC\-4 revision 26 target reset and wakeup task management functions
were made obsolete.
.PP
In the 2.4 series of Linux kernels the \fIDEVICE\fR must be a SCSI
generic (sg) device. In the 2.6 series block devices (e.g. SCSI disks
and DVD drives) can also be specified. For example "sg_opcodes /dev/sda"
will work in the 2.6 series kernels.
.SH EXIT STATUS
The exit status of sg_opcodes is 0 when it is successful. Otherwise see
the sg3_utils(8) man page.
.SH OLDER COMMAND LINE OPTIONS
The options in this section were the only ones available prior to sg3_utils
version 1.23 . Since then this utility defaults to the newer command line
options which can be overridden by using \fI\-\-old\fR (or \fI\-O\fR) as the
first option. See the ENVIRONMENT VARIABLES section for another way to
force the use of these older command line options.
.TP
\fB\-a\fR
sort command alphabetically. Equivalent to \fI\-\-alpha\fR in main
description.
.TP
\fB\-c\fR
see the \fI\-\-compact\fR option above.
.TP
\fB\-e\fR
see the \fI\-\-enumerate\fR option above.
.TP
\fB\-H\fR
see the \fI\-\-hex\fR option above.
.TP
\fB\-m\fR
see the \fI\-\-mask\fR option above.
.TP
\fB\-n\fR
don't print a summary of the SCSI INQUIRY response on stdout.
.TP
\fB-N\fR, \fB\-\-new\fR
Switch to the newer style options.
.TP
\fB\-o\fR=\fIOP\fR
the \fIDEVICE\fR will be queried for the given operation code (i.e.
\fIOP\fR) which is the first byte of a SCSI command. \fIOP\fR is
hexadecimal and expected to be in the range 0 to ff inclusive.
When this option is not given then all available SCSI commands supported
by the \fIDEVICE\fR are listed.
.TP
\fB\-p\fR=\fIDT\fR
see the \fI\-\-pdt=DT\fR option above.
.TP
\fB\-q\fR
set the read extended parameter data (REPD) bit in report TMF cdb.
Equivalent to \fI\-\-repd\fR in main description.
.TP
\fB\-R\fR
set the report command timeout descriptor (RCTD) bit in cdb. Equivalent
to \fI\-\-rctd\fR in main description.
.TP
\fB\-s\fR=\fISA\fR
the \fIDEVICE\fR will be queried for a command with the given service
action (i.e. \fISA\fR). Used in conjunction with the \fI\-o=OP\fR
option. If this option is not given, \fI\-o=OP\fR is given and the command
in question does have a service action then a value of 0 will be assumed.
\fISA\fR is hexadecimal and expected to be in the range 0 to ffff inclusive.
.TP
\fB\-t\fR
list supported task management functions. Equivalent to \fI\-\-tmf\fR in
the main description.
.TP
\fB\-u\fR
output all supported commands in the order given by \fIDEVICE\fR.
Equivalent to \fI\-\-unsorted\fR in main description.
.TP
\fB\-v\fR
increase level of verbosity. Can be used multiple times.
.TP
\fB\-V\fR
print out version string then exit.
.TP
\fB\-?\fR
output usage message. Ignore all other parameters.
.SH EXAMPLES
The examples in this page use Linux device names. For suitable device
names in other supported Operating Systems see the sg3_utils(8) man page.
.PP
To see the information about a specific command give its operation
code to the '\-\-op=' option. A command line invocation is shown first
followed by a typical response:
.PP
   # sg_opcodes \-\-op=93h /dev/sdb
.PP
  Opcode=0x93
  Command_name: Write same(16)
  Command supported [conforming to SCSI standard]
  Usage data: 93 e2 00 00 00 00 ff ff ff ff 00 00 ff ff 00 00
.PP
The next example shows the supported task management functions:
.PP
   # sg_opcodes \-\-tmf \-n /dev/sdb
.PP
Task Management Functions supported by device:
    Abort task
    Abort task set
    Clear ACA
    Clear task set
    Logical unit reset
    Query task
.PP
Enumerate can be used to look up a SCSI command name in the absence of a
device that supports that command. The opcode and service action (if
required) should be supplied:
.PP
   # sg_opcodes \-\-enumerate \-\-op=0x9b,0xa
.PP
  SCSI command:
    Read buffer(16), read data from echo buffer
.SH ENVIRONMENT VARIABLES
Since sg3_utils version 1.23 the environment variable SG3_UTILS_OLD_OPTS
can be given. When it is present this utility will expect the older command
line options. So the presence of this environment variable is equivalent to
using \fI\-\-old\fR (or \fI\-O\fR) as the first command line option.
.SH AUTHOR
Written by Douglas Gilbert
.SH "REPORTING BUGS"
Report bugs to <dgilbert at interlog dot com>.
.SH COPYRIGHT
Copyright \(co 2004\-2023 Douglas Gilbert
.br
This software is distributed under the GPL version 2. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
.SH "SEE ALSO"
.B sg_inq,sg3_utils_json(sg3_utils)
